// 主要思路：先统计出每一个数字出现的次数，相应乘积之和便是最后的结果
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
typedef long long ll;
ll l = 1, r, dp[N], mi[N];
ll ans1[N], ans2[N];
int a[N];

void solve(ll n, ll *ans)
{
	ll tmp = n;
	int len = 0;
	while (n)
	{
		a[++len] = n % 10;
		n /= 10;
	}
	for (int i = len; i >= 1; --i)
	{
		for (int j = 0; j < 10; j++)
			ans[j] += dp[i - 1] * a[i]; // 第i位的数字对于别的位上的数字出现次数的贡献
		for (int j = 0; j < a[i]; j++)
			ans[j] += mi[i - 1]; // 第i位之前的几位对于第i位的出现次数的贡献

		tmp -= mi[i - 1] * a[i]; // tmp 表示当前位之后剩余的数字，也就是当前位右边的所有位上的数字组成的数值
		ans[a[i]] += tmp + 1;	 //+1是算上自身
		ans[0] -= mi[i - 1];	 // 处理前导0
	}
}

int main()
{
	cin >> r;
	mi[0] = 1ll; // 1ll为强制类型转换
	for (int i = 1; i <= 13; ++i)
	{
		dp[i] = dp[i - 1] * 10 + mi[i - 1];
		mi[i] = 10ll * mi[i - 1];
	}
	solve(r, ans1);
	solve(l - 1, ans2);
	ll ans = 0;
	for (int i = 0; i <= 9; i++)
		ans += (ans1[i] - ans2[i]) * i;
	cout << ans << endl;
	return 0;
}
